import android.util.Log
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavHostController
import com.example.senior_homework.utils.localDateToDate
import com.example.senior_homework.viewmodel.MyViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.time.LocalDate
import java.time.Year
import java.time.YearMonth

/*
*author:guyueyuan
*createTime:2024/11/18
*/


/*
*
* 顶层 Composable：在顶层 Composable 中获取 ViewModel，确保 ViewModelStoreOwner 是稳定的。
子层 Composable：将 ViewModel 作为参数传递给子层 Composable，避免在子层中重新获取 ViewModel，确保 ViewModel 的生命周期管理正确。
*
* */

@Composable
fun Shows(viewModel: MyViewModel= viewModel()) {
//    val viewModel_3: MyViewModel = viewModel(LocalViewModelStoreOwner.current!!)
//    在这些子组件中就是不能创建的了？
//    暂时先不管了，先记住就两个地方创建
    Log.i("current_ad","ViewModel address_3: ${System.identityHashCode(viewModel)}")
    Log.i("current_lc","lc_2 is ：$LocalViewModelStoreOwner.current")

    var year by remember {
        mutableStateOf(Year.now().value)
    }
    var month by remember {
        mutableStateOf(YearMonth.now().monthValue)
    }

    var firstVisibleWeekDay by remember {
        mutableStateOf(LocalDate.now())
    }

//    因为是state是不可变量，所以这里也是要用val
//    委托也要理解一下，
//    使用 by 关键字可以将属性的 getter 和 setter 委托给另一个对象。
//    由于 State 对象是只读的，你只能委托 getter，而不能委托 setter。
//    我读取委托的对象就是调用原对象的getter，我更改对象的时候，就是调用原对象的setter，
    val currentCheckedDay by viewModel.currentCheckedDay
    val datas by viewModel.dataItems

//    这里没有问题吧？等会儿测试了才知道
    LaunchedEffect(currentCheckedDay) {
        println("current time is $currentCheckedDay")
        viewModel.loadDatas()
    }

/*
*
LaunchedEffect 重新执行时使用最新的依赖项值：当 LaunchedEffect 的依赖项发生变化时，它会重新启动，并使用最新的依赖项值。
协程运行期间依赖项的变化：在协程运行期间，即使依赖项发生变化，LaunchedEffect 也不会重新捕获这些新的依赖项值。
协程会继续使用启动时捕获的值，直到完成或被取消。
rememberUpdatedState 确保协程使用最新的值：如果你需要在协程的整个生命周期中使用最新的依赖项值，
可以使用 rememberUpdatedState。这样，即使在协程运行期间依赖项发生变化，你也能访问到最新的值。
*
* */


    Column (
        modifier = Modifier
            .fillMaxHeight()
            .fillMaxWidth()
            .background(color = Color(0xffEBEBEB))
    ){
        TopHead (
            viewModel,
            currentCheckedDay =currentCheckedDay,
            ){ m, y->
            month=m
            year=y
            viewModel.updateCurrentCheckedDay(if (month==YearMonth.now().monthValue && year==Year.now().value) LocalDate.now() else LocalDate.of(year,month,1))
            firstVisibleWeekDay = if (month==YearMonth.now().monthValue && year==Year.now().value) LocalDate.now() else LocalDate.of(year,month,1)
        }
        WeekScroll(
            currentCheckedDay=currentCheckedDay,
            currentMonth = YearMonth.of(year,month),
            firstVisibleWeekDay = firstVisibleWeekDay
        ){
            viewModel.updateCurrentCheckedDay(it)
        }
        LazyColumn(
            modifier = Modifier
                .fillMaxHeight()
                .fillMaxWidth(),
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            if(datas != null){
                items(datas!!,key ={ data->data.id }){ data->
                    Spacer(modifier = Modifier.height(8.dp))
                    DataItem(data, removeClicked = {id->
                        viewModel.deleteDataByIdAndRefresh(id)
                    }){
                        viewModel.navTO("show_details/${data.id}")
                    }
                }
            }
        }
    }
}

@Preview
@Composable
fun ShowsPre() {
}